package com.simple.framework.core.action;

import com.simple.framework.core.entry.ActionContext;
import com.simple.framework.core.entry.ActionResult;

/**
 * 复杂事件模板
 * 
 * @author wujiangpo
 *
 * @param <R>
 * @param <C>
 */
public abstract class ComplexAction<R extends ActionResult, C extends ActionContext> implements Action<R, C> {

	@Override
	public R process(C context) {
		checkParam(context);
		beforProcess(context);
		R result = subProcess(context);
		afterProcess(context);
		return assemble(context, result);
	}

	/**
	 * 参数校验
	 * 
	 * @param context
	 */
	protected abstract void checkParam(C context);

	/**
	 * 执行前
	 * 
	 * @param context
	 */
	protected abstract void beforProcess(C context);

	/**
	 * 具体的事件执行
	 * 
	 * @param context
	 * @return
	 */
	public abstract R subProcess(C context);

	/**
	 * 执行后
	 * 
	 * @param context
	 */
	protected abstract void afterProcess(C context);

	/**
	 * 结果拼装
	 * 
	 * @param context
	 * @param result
	 * @return
	 */
	protected abstract R assemble(C context, R result);
}
